
/***************************************************************************
 *   jell - library                                                        *
 *                                                                         *
 *   Copyright (C) 2008 by kuerant                                         *
 *                         <kuerant@gmail.com>                             *
 *                                                                         *
 *   This library is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU Library General Public License as       *
 *   published by the Free Software Foundation; either version 2 of the    *
 *   License, or (at your option) any later version.                       *
 *                                                                         *
 *   This library is distributed in the hope that it will be usefull, but  *
 *   WITHOUT ANY WARRANTY; without even the implied warranty of            *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      *
 *   Library General Public License for more details.                      *
 *                                                                         *
 *   You should have received a copy of the GNU Library General Public     *
 *   License along with this library; if not, write to the Free Software   *
 *   Foundation, Inc., 59 Temple Place - Suite 330, Boston,                *
 *   MA 02111-1307, USA                                                    *
 ***************************************************************************/

#ifndef JEFI_STRING_HPP
#define JEFI_STRING_HPP

#include    <string>
#include    <cstdarg>
#include    <cstdlib>

namespace   jell
{

    class   String
    {

    public  :
        static  std::string format(const char* pszFormat, ...)
        {
            char    szBuf[1024];
            int     n, size  = sizeof(szBuf);
            char*   p = szBuf;
            va_list args;

            do {
                va_start(args, pszFormat);
                n = vsnprintf(p, size - 1, pszFormat, args);
                va_end(args);

                if (n > -1 && n < size) {
                    break;
                }

                if (n > -1)         // glibc 2.1
                    size = n + 1;   //    exactly what's need
                else                // glibc 2.0
                    size *= 2;      //    double size and try again

                p = (char *)(p == szBuf ? malloc(size) : realloc(p, size));

                if (NULL == p) {
                    throw std::bad_alloc();
                }
            } while(true);

            if (p == szBuf) {
                return  std::string(p, n);
            }

            std::string result(p, n);
            free(p);
            return  result;
        }   // format()

    };  // class String

}   // namespace jell

#endif  // JEFI_STRING_HPP

